// const curry = (fn, arr = []) => (...args) => (
//   arg => arg.length === fn.length
//     ? fn(...arg)
//     : curry(fn, arg)
// )([...arr, ...args])

// let curryTest = curry((a, b, c, d) => a + b + c + d)
// curryTest(1, 2, 3)(4) //返回10
// curryTest(1, 2)(4)(3) //返回10
// curryTest(1, 2)(3, 4) //返回10

// const curry = (fn, arr = []) => {// arr就是我们要收集每次调用时传入的参数
//   let len = fn.length; // 函数的长度，就是参数的个数
//   return function (...args) {
//     let newArgs = [...arr, ...args] // 收集每次传入的参数
//     // 如果传入的参数个数等于我们指定的函数参数个数，就执行指定的真正函数
//     if (newArgs.length === len) {
//       return fn(...newArgs)
//     } else {
//       // 递归收集参数
//       return curry(fn, newArgs)
//     }
//   }
// }

// function curry(fn, arr = []) {
//   return function (...args) {
//     let newArr = [...arr, ...args]
//     if (newArr.length === fn.length) {
//       return fn(...newArr)
//     } else {
//       return curry(fn, newArr)
//     }
//   }
// }

// function sum(a, b, c) {
//   return a + b + c
// }
// let demo = curry((a, b, c) => a + b + c)

// let curryTest = demo((a, b, c, d) => a + b + c + d)

// function demo(fn, arr = []) {

//   let length = fn.length
//   return function (...args) {
//     // 收集数组
//     let newArr = [args, ...arr]
//     if (args.length != length) {
//       demo(fn, newArr)
//     } else {
//       fn(...newArr)
//     }
//   }
// }

// curryTest(1, 2, 3)(4) //返回10
// curryTest(1, 2)(4)(3) //返回10
// curryTest(1, 2)(3, 4) //返回10

// function sum(a, b, c, d, e) {
//   return a + b + c + d + e
// }

// let newSum = curry(sum)

// // 柯里化 每次入参都是一个参数
// // newSum(1)(2)(3)(4)(5)

// // 偏函数
// console.log(newSum(1)(2)(3, 4, 5));


